/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import path from 'path';
import { FileUtil } from '@ohos/hvigor';
import { HMRouterPluginConstant } from './common/Constant';

export class HMRouterPluginConfig {
  moduleName: string;
  modulePath: string;
  scanDir: string[];
  routerMapDir: string;
  builderDir: string;
  annotation: string[];
  builderTpl: string;
  saveGeneratedFile: boolean;

  constructor(moduleName: string, modulePath: string, param: HMRouterPluginConfigParam) {
    this.moduleName = moduleName;
    this.modulePath = modulePath;
    this.scanDir = param.scanDir ? [...new Set(param.scanDir)] : ['src/main/ets'];
    this.routerMapDir = param.routerMapDir ? param.routerMapDir : 'src/main/resources/base/profile';
    this.builderDir = param.builderDir ? param.builderDir : 'src/main/ets/generated';
    this.annotation = ['HMRouter', 'HMAnimator', 'HMInterceptor', 'HMLifecycle', 'HMService'];
    this.builderTpl = param.builderTpl ? param.builderTpl : 'viewBuilder.tpl';
    this.saveGeneratedFile = !!param.saveGeneratedFile;
  }

  getScanPath(dir: string) {
    return FileUtil.pathResolve(this.modulePath, dir);
  }

  getRelativeSourcePath(filePath: string) {
    return path.relative(this.modulePath, filePath);
  }

  getRelativeBuilderPath(filePath: string) {
    return path.relative(this.builderDir, filePath);
  }

  getGeneratedFilePath(generatorViewName: string) {
    return FileUtil.pathResolve(
      this.modulePath,
      this.builderDir,
      generatorViewName + HMRouterPluginConstant.VIEW_NAME_SUFFIX
    );
  }

  getBuilderDir() {
    return FileUtil.pathResolve(this.modulePath, this.builderDir);
  }

  getBuilderFilePath(generatorViewName: string) {
    return path.join(this.builderDir, generatorViewName + HMRouterPluginConstant.VIEW_NAME_SUFFIX);
  }

  getRouterMapDir() {
    return FileUtil.pathResolve(this.modulePath, this.routerMapDir, HMRouterPluginConstant.ROUTER_MAP_NAME);
  }

  getModuleRouterMapFilePath(routerMapFileName: string) {
    return FileUtil.pathResolve(
      this.modulePath,
      this.routerMapDir,
      routerMapFileName + HMRouterPluginConstant.JSON_SUFFIX
    );
  }

  getRawFilePath() {
    return FileUtil.pathResolve(this.modulePath, HMRouterPluginConstant.RAWFILE_DIR);
  }

  getTplFilePath() {
    return FileUtil.pathResolve(__dirname, HMRouterPluginConstant.PARENT_DELIMITER + this.builderTpl);
  }
}

export interface HMRouterPluginConfigParam {
  scanDir?: string[];
  routerMapDir?: string;
  builderDir?: string;
  saveGeneratedFile?: boolean; // 隐藏字段仅用于调试
  builderTpl?: string; // 隐藏字段仅用于调试
}
